﻿Error subclass: #AlcanceAgotadoError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Error subclass: #ArmaVaciaError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Object subclass: #Armas	instanceVariableNames: 'carga balas'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Armas commentStamp: '<historical>' prior: 0!esta clase es una clase abstracta. Es la encargada de crear las balas ("disparar") en el lugar que corresponda, simpre y cuando su carga no se haya agotadoInstance Variables:	carga	<CargaAgotable>	balas	<Avioneta class | BalaCohete class | BalaCoheteAlgo42 class | BalaTorpedoRastreadorAlgo42 class | BalasTorpedoRastreador class | BalasTorpedoSimple class | Bombardero class | Cazas class | Civiles class | DesplazadorBuscador class | DesplazadorLineaRecta class | Explorador class | LuzLaser class | LuzLaserAlgo42 class | Policias class>!!Armas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:49'!dispararDesde: unaPosicion hacia: otraPosicion		"dispara una bala y devuelve una instancia de las balas correspondientes"	|unaBala|	"si la carga esta agotada no debe permitir seguir disparando"	(carga agotada) ifTrue: [FaltaDeCargaError new signal].	"sino devuelve una instancia de la bala correspondiente"	unaBala := balas crearDesde: unaPosicion hacia: otraPosicion .	carga descontar.	^unaBala.	! !!Armas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:14'!getCarga	^carga getValor.! !!Armas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 19:30'!puedeSeguirDisparando 	^ ( carga agotada ) not.! !!Armas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 16:55'!setBalas: unaClaseBalas	balas := unaClaseBalas.! !Armas subclass: #ArmaCompuesta	instanceVariableNames: 'armas'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ArmaCompuesta commentStamp: '<historical>' prior: 0!esta clase puede contener distintos tipos de armas, de forma que una nave pueda usar varias y a medida que una se acaba pasar a la siguiente.Instance Variables:	armas	<(LinkedList of: (Armas | NaveAlgo42 | NavesArmadas))>!!ArmaCompuesta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:24'!addArma: unArma	armas addFirst: unArma.! !!ArmaCompuesta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:52'!chequearArma	"verifica si hay algun arma o cambia al arma siguiente segun corresponda"	|unArma|	"si no hay arma no debe permitir continuar"	(armas size < 1 )ifTrue: [ArmaVaciaError new signal].	"si hay mas de un arma y no puede seguir disparando cambia a la siguiente"	unArma := armas first.	(unArma puedeSeguirDisparando) ifFalse: [		(armas size>1) ifTrue: [ 			armas removeFirst.		]	].	! !!ArmaCompuesta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:52'!dispararDesde: unaPosicion hacia: otraPosicion	|unArma unaBala|	"si la carga esta agotada no debe permitir seguir disparando"	self chequearArma.	unArma := armas first.	^unArma dispararDesde: unaPosicion  hacia: otraPosicion. ! !!ArmaCompuesta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:35'!initialize 	armas := LinkedList new.! !!ArmaCompuesta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:22'!puedeSeguirDisparando 	"chequea si hay que cambiar de arma"	[ self chequearArma ] on: ArmaVaciaError do: [^false].	"corrobora que el arma que queda pueda seguir disparando "	^(armas first puedeSeguirDisparando ).! !Object subclass: #Cargas	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Cargas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 14:02'!agotada	"devuelve true o false segun corresponda"		^self subclassResponsibility.! !!Cargas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 00:12'!descontar	self subclassResponsibility.! !Cargas subclass: #CargaAgotable	instanceVariableNames: 'contador'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!CargaAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 23:43'!agotada	^contador agotado.! !!CargaAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:57'!descontar 		contador descontar.! !!CargaAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:15'!getValor	^contador getValor.! !!CargaAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 00:17'!setContador: unContador	contador := unContador.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!CargaAgotable class	instanceVariableNames: ''!!CargaAgotable class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 00:19'!crear: unValor		|unaCarga|		unaCarga := CargaAgotable new.	unaCarga setContador: (ContadorSimple crear: unValor ).	^unaCarga.! !Cargas subclass: #CargaNoAgotable	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!CargaNoAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:01'!agotada	"la carga nunca se agota"	^false.! !!CargaNoAgotable methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 19:58'!descontar	"como la carga nunca se agota, descontar no debe hacer nada"	[]! !Object subclass: #Circulo	instanceVariableNames: 'r centro'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Circulo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 01:20'!getCentro 	^centro .! !!Circulo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 01:21'!getR	^r.! !!Circulo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 16:02'!intersecta: otroCirculo	"devuelve true o false segun si dos circulos se intersectan o no, teniendo en 	cuenta que como interseccion se toma el caso de un punto, dos puntos, o bien que 	uno este contenido en el otro"	|distaciaEntreCentros|				distaciaEntreCentros := (self getCentro ) dist: (otroCirculo getCentro).	"si la distancia entre los centros es mayor a la suma de los radios los circulos 	no se intersectan"	(distaciaEntreCentros  > (self getR + otroCirculo getR ) )ifTrue: [		^false.		].	"si es menor o igual se intersectan al menos en un punto"	^true.! !!Circulo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 01:04'!setCentro: unaPosicion	centro:= unaPosicion.! !!Circulo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 01:02'!setR: unR	r:= unR.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Circulo class	instanceVariableNames: ''!!Circulo class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 01:22'!crearConCentro: unaPosicion conR: unR	|unCirculo|		unCirculo := Circulo new.	unCirculo setCentro: unaPosicion.	unCirculo setR: unR.	^unCirculo.! !Error subclass: #ClasesDeNavesAgotadaError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Armas subclass: #Cohete	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Cohete methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 02:27'!initialize 	"inicializa laser, la carga del laser no se acaba."	carga := CargaAgotable crear: 10.	balas:= BalaCohete.! !Armas subclass: #CoheteAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!CoheteAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:51'!initialize 	"inicializa laser, la carga del laser no se acaba."	carga := CargaAgotable crear: 10.	balas:= BalaCoheteAlgo42.! !Error subclass: #ContadorStopError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Object subclass: #Contadores	instanceVariableNames: 'valor'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Contadores commentStamp: '<historical>' prior: 0!Instance Variables:	valor	<DateAndTime | Duration | Number | Point | Timespan>!!Contadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 23:41'!agotado	"devuelve true o false segun si el contador esta agotado o no"	^valor <= 0.! !!Contadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 16:44'!agotar	valor:= 0.! !!Contadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:49'!getValor	^valor.! !!Contadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:56'!setValor: unValor	valor := unValor .! !Contadores subclass: #ContadorComplejo	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ContadorComplejo commentStamp: '<historical>' prior: 0!ContadorComplejo es un Contador que permite descontar distintos valores segun el parametro que reciba.!!ContadorComplejo methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 23:42'!descontar: unValor		"reduce valor en unValor"	"en caso de llegar a cero no debe permitir seguir descontando"	"unValor no debe ser negativo"	(unValor <0)ifTrue: [ValorInvalidoError new signal].	(valor <= 0 ) ifTrue: [ContadorStopError new signal].	valor := valor - unValor .! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!ContadorComplejo class	instanceVariableNames: ''!!ContadorComplejo class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:55'!crear: unValor	|unContadorComplejo|		unContadorComplejo := ContadorComplejo new.	unContadorComplejo setValor: unValor.	^unContadorComplejo .! !Contadores subclass: #ContadorSimple	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ContadorSimple commentStamp: '<historical>' prior: 0!ContadorSimple es un contador que solo descuenta de a 1 por vez.!!ContadorSimple methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 18:49'!descontar	"reduce el valor en 1"	"en caso de llegar a cero no debe permitir seguir descontando"		(valor <= 0) ifTrue: [ContadorStopError new signal]. 	valor := valor - 1.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!ContadorSimple class	instanceVariableNames: ''!!ContadorSimple class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 18:33'!crear: unValor	|unContadorSimple|		unContadorSimple := ContadorSimple new.	unContadorSimple setValor: unValor .	^unContadorSimple .! !Object subclass: #CreadorPosicionAtRandomX	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!CreadorPosicionAtRandomX class	instanceVariableNames: ''!!CreadorPosicionAtRandomX class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:38'!crearPosicion	^(Posicion atRandomX).! !!CreadorPosicionAtRandomX class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:38'!getDireccion	^(Posicion X: 0 Y: -1)! !Object subclass: #CreadorPosicionAtRandomY	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!CreadorPosicionAtRandomY class	instanceVariableNames: ''!!CreadorPosicionAtRandomY class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:39'!crearPosicion	^(Posicion atRandomY).! !!CreadorPosicionAtRandomY class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:39'!getDireccion 	^(Posicion X: 1 Y: 0)! !Object subclass: #CreadorPosicionV	instanceVariableNames: ''	classVariableNames: 'cant lado'	poolDictionaries: ''	category: 'TP1-1942'!!CreadorPosicionV commentStamp: '<historical>' prior: 0!esta clase permite crear una serie posiciones formando una V.!]style[(61)f1!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!CreadorPosicionV class	instanceVariableNames: ''!!CreadorPosicionV class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:22'!crearPosicion	|x y|	(cant = nil) ifTrue: [cant := 0].	(cant>6)ifTrue: [		cant := 0.		lado := 1].	(lado = nil )ifTrue: [lado := 1].		x := ((Posicion getX/2)+(lado*(cant/2))) asInteger. 	y := (Posicion getY).		(lado = 1)ifTrue: [ lado:= -1] ifFalse: [lado:= 1].	cant := cant+1.	^ Posicion X: x Y: y.! !!CreadorPosicionV class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:23'!getDireccion 	^(Posicion X: 0 Y: -1).	! !!CreadorPosicionV class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 21:53'!reiniciar 	cant := nil.	lado := nil.! !Object subclass: #DanioLineal	instanceVariableNames: 'valor'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DanioLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 21:45'!causarDanioSobre: unValor	"dependiendo del valor recibido por parametro cada subclase tendra un	comportamiento distinto, y debe devolver un numero de acuerdo a ello."		"por el momento solo devuelve el valor, pero podria ampliarse a devolver 	 la mitad de unValor , por ejemplo."		^valor.! !!DanioLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 12:19'!getValor	^valor.! !!DanioLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 23:57'!setValor: unValor	valor := unValor.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!DanioLineal class	instanceVariableNames: ''!!DanioLineal class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 02:53'!crear: unValor 	|unDanio|	unDanio := DanioLineal new.	unDanio setValor: unValor.	^unDanio.! !Object subclass: #Desplazadores	instanceVariableNames: 'posicion avanzar velocidad'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Desplazadores commentStamp: '<historical>' prior: 0!Esta clase es la encargada de desplazar los distintos objetos del juego. la distancia entre dos posiciones es aproximadamente 1.Instance Variables:	posicion	<Posicion>	velocidad	<Integer>	avanzar	<Integer>!!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/28/2011 16:13'!getPosicion	"devuelve la posicion actual del desplazador"	^posicion.! !!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 00:25'!getSigPos			"devuelve la siguiente posicion que le corresponde pero sin avanzar "		self subclassResponsibility .! !!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/28/2011 16:14'!mover	"permite avanzar una posicion, las posiciones siempre deben ser contiguas	y de valores enteros." 	posicion := self getSigPos.	^posicion.! !!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:01'!retroceder	self subclassResponsibility.! !!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 15:27'!setPosicion: unaPosicion	posicion := unaPosicion.! !!Desplazadores methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:45'!setVelocidad: unValor	velocidad := unValor.! !Desplazadores subclass: #DesplazadorAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 20:27'!getSigPos	"siguiente posicion siempre indicara una posicion arriba de la que se encuentra"	^ (posicion + (Posicion X: 0 Y: 1)).! !!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:54'!initialize 	posicion := Posicion centradaX.! !!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:17'!moverAb	"desplaza posicion un lugar hacia abajo"	|nuevaPos|		nuevaPos  := (Posicion X: 0 Y: -1)+posicion.		(nuevaPos esValida  ) ifTrue: [			posicion := nuevaPos].	^posicion.! !!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:17'!moverArr	|nuevaPos|	nuevaPos  := (Posicion X: 0 Y: 1)+posicion.	(nuevaPos esValida  ) ifTrue: [		posicion := nuevaPos].	^posicion.! !!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:17'!moverDer 	|nuevaPos|	nuevaPos  := (Posicion X: 1 Y: 0)+posicion.	(nuevaPos esValida  ) ifTrue: [		posicion := nuevaPos].	^posicion.! !!DesplazadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:17'!moverIzq	|nuevaPos|	nuevaPos  := (Posicion X: -1Y:0 )+posicion.	(nuevaPos esValida  ) ifTrue: [		posicion := nuevaPos].	^posicion.! !Desplazadores subclass: #DesplazadorBuscador	instanceVariableNames: 'posicionASeguir'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DesplazadorBuscador commentStamp: '<historical>' prior: 0!esta clase debe desplazar la posicion inicial siguiendo a otra posicion : "posicion a seguir"Instance Variables:	posicionASeguir	<ProtoObject | PseudoContext>!!DesplazadorBuscador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 21:43'!getSigPos	"devuelve la siguiente posicion pero sin modificarla"	"si se encuentra cerca de la posicion a seguir directamente debe devolver dicha posicion"	((posicion dist: posicionASeguir )<velocidad) ifTrue: [		^posicionASeguir ]	ifFalse: [   "sino debe calcularla"		^ (posicion +( (posicion obtenerDireccionHacia: posicionASeguir ) multiploDeNorma: velocidad)).	]! !!DesplazadorBuscador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 20:14'!initialize 	velocidad := 1.! !!DesplazadorBuscador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/28/2011 16:12'!setPosicionAseguir: unaPosicion	"permite actualizar la posicion a seguir"	posicionASeguir := unaPosicion.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!DesplazadorBuscador class	instanceVariableNames: ''!!DesplazadorBuscador class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:47'!crearDesde: unaPosicion hacia: otraPosicion	"crea una instancia de desplazador buscador,	otra posicion es la posicion que debe seguir"	|unDesplazador|		unDesplazador := DesplazadorBuscador new.	unDesplazador setPosicion: unaPosicion.	unDesplazador setPosicionAseguir: otraPosicion.	^unDesplazador.! !Desplazadores subclass: #DesplazadorCircularAvanzandoY	instanceVariableNames: 'x y phi sentido xi yi r inc'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DesplazadorCircularAvanzandoY commentStamp: '<historical>' prior: 0!esta clase desplaza la posicion inicial en forma de circulos que se desplazan sobre el eje y. Para ello utiliza las ecuaciones que describen el movimiento de un punto en una rueda.Instance Variables:	x	<Integer>	y	<Integer>	phi	<Number>	sentido	<Number>	xi	<AbstractSound | Color | DateAndTime | Duration | EnergiaLineal | Interval | Number | Point | Timespan | TraitComposition | TraitDescription | TraitTransformation>	yi	<AbstractSound | Color | DateAndTime | Duration | EnergiaLineal | Interval | Number | Point | Timespan | TraitComposition | TraitDescription | TraitTransformation>	r	<Float | Fraction | Integer>	inc	<ProtoObject | PseudoContext>!!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:50'!getPosicion	^(Posicion X: x Y: y).! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/28/2011 16:19'!getSigPos  	^(self getSigPos: false).! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 22:08'!getSigPos: modificar	|nx ny nphi sigPos|		ny := yi + (sentido * (r * ((phi / Float pi) - (phi cos))) ).	nx := xi + (r* (phi sin)).	nphi := phi + inc.	sigPos := (Posicion X: nx Y: ny).	(modificar)ifTrue: [ 		x:= nx.		y:= ny.		phi:= nphi.		posicion := sigPos ].	^sigPos .! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:45'!initialize 	velocidad := 1.! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/28/2011 16:21'!mover 	^ (self getSigPos: true).	! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 23:30'!retroceder	inc := inc negated.! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:54'!setDirDesde: unaPosicion hacia: otraPosicion	|dir |		dir := unaPosicion obtenerDireccionHacia: otraPosicion. 	(dir y > 0 )ifTrue:[sentido := 1] ifFalse: [sentido := -1]. 	xi := unaPosicion x.	yi := unaPosicion y.	x := -1.	y := -1.	"calculo la primer posicion para que x e y queden en un estado valido"	self getSigPos: true.		! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:54'!setR: radio	r := radio.	inc := (velocidad / (r asFloat ) *0.7).	phi :=(  (Float pi)/(3 asFloat))+inc.		! !!DesplazadorCircularAvanzandoY methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:49'!setVelocidad: unValor	super setVelocidad: unValor.	self setR: (r).! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!DesplazadorCircularAvanzandoY class	instanceVariableNames: ''!!DesplazadorCircularAvanzandoY class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/23/2011 16:10'!crearDesde: unaPosicion hacia: otraPosicion r: radio	|unDesplazador|		unDesplazador := DesplazadorCircularAvanzandoY new.	unDesplazador setR: radio.	unDesplazador setDirDesde: unaPosicion  hacia: otraPosicion .	^unDesplazador.  ! !Desplazadores subclass: #DesplazadorLineaRecta	instanceVariableNames: 'direccion'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DesplazadorLineaRecta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 00:18'!getSigPos		"devuelve la siguiente posicion pero sin modificarla"	^posicion + ((direccion multiploDeNorma: velocidad ) multiplicarPorEscalar: avanzar) .! !!DesplazadorLineaRecta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:01'!initialize 	velocidad := 1.	avanzar := 1.! !!DesplazadorLineaRecta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:01'!retroceder 	avanzar := -1.! !!DesplazadorLineaRecta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 00:16'!setDirHacia: otraPosicion	direccion := (posicion obtenerDireccionHacia: otraPosicion)normalized.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!DesplazadorLineaRecta class	instanceVariableNames: ''!!DesplazadorLineaRecta class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 15:28'!crearDesde: unaPosicion hacia: otraPosicion	|unDesplazador|		unDesplazador:= DesplazadorLineaRecta new.	unDesplazador setPosicion: unaPosicion.	unDesplazador setDirHacia: otraPosicion .	^unDesplazador. 		! !DesplazadorLineaRecta subclass: #DesplazadorZigZag	instanceVariableNames: 'contador d1 d2'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 16:00'!cambiarDir	direccion:= self direccionOpuesta.	self iniciarContador! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 00:34'!direccionOpuesta	(direccion = d1) ifTrue:[		^ d2.]	ifFalse:[		^d1].! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 18:57'!getSigPos 	(contador agotado) ifTrue: [		^posicion + (self direccionOpuesta) .		].	^posicion + direccion.	! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 00:53'!iniciarContador	contador := ContadorSimple crear: 12.! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 18:51'!initialize 		velocidad := 1.! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 18:56'!mover 	"este método está redefinido por razones de eficiencia,	si utilizara el getSigPos como sus ancentros se necesitaría	hacer dos veces el cálculo de la nueva direccion."	(contador agotado) ifTrue: [		self cambiarDir.		].	contador descontar.	posicion := posicion + direccion.	^posicion.! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 23:20'!retroceder	self setDirHacia: ((self getSigPos ) multiplicarPorEscalar: -1). 	self iniciarContador.! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 19:00'!setDirHacia: unaPosicion	"inicializa las direcciones segun si debe moverse hacia arriba o hacia 	abajo"	|a b|	a:= ((2 sqrt) /2 *velocidad). "0.707....*velocidad ."	b:= ((2 sqrt) /2 *velocidad*(-1)). " - 0.707.....*velocidad "	(unaPosicion y > posicion y) ifTrue: [		d1 := (Posicion X: a Y: a).		d2 := (Posicion X: b Y: a).]	ifFalse:[		d1:= (Posicion X: b Y: b).		d2 := (Posicion X: a Y: b).		].	direccion := d1.! !!DesplazadorZigZag methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:51'!setVelocidad: unValor		super setVelocidad: unValor.	self setDirHacia: (self getSigPos ).! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!DesplazadorZigZag class	instanceVariableNames: ''!!DesplazadorZigZag class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 16:21'!crearDesde: unaPosicion hacia: otraPosicion	|unDesplazadorZigZag|		unDesplazadorZigZag := DesplazadorZigZag  new.	unDesplazadorZigZag setPosicion: unaPosicion.	unDesplazadorZigZag setDirHacia: otraPosicion .	unDesplazadorZigZag iniciarContador.	^unDesplazadorZigZag. ! !Error subclass: #EnergiaAgotadaError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Object subclass: #EnergiaLineal	instanceVariableNames: 'contador'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:44'!+ otraEnergia	^EnergiaLineal crear: ((self getValor ) + (otraEnergia getValor )).! !!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:44'!agotada	"devuelve true o false segun corresponda"	^ contador agotado.! !!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 11:31'!agotar	contador descontar: (self getValor).! !!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:49'!getValor	^ contador getValor.! !!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 21:46'!recibirDanio: unValor	"disminuye valor en un numero"	"este bloque de codigo puede lanzar un error del tipo ContadorStopError,	pero aun asi debe seguir funcionando, pues puede que quien contenga a 	energia sea atacado por mas de un objeto a la vez."		[contador descontar: unValor] on: ContadorStopError do: [ ].! !!EnergiaLineal methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 12:29'!setContador: unContador	contador := unContador.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!EnergiaLineal class	instanceVariableNames: ''!!EnergiaLineal class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 13:45'!crear: unValor	|unaEnergia|		unaEnergia := EnergiaLineal new.	unaEnergia setContador: (ContadorComplejo crear: unValor ).	^unaEnergia.		! !Object subclass: #EscenarioDeJuego	instanceVariableNames: 'objetos jugador clasesDeNaves flotaEnemigos flotaNeutrales'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!EscenarioDeJuego commentStamp: '<historical>' prior: 0!esta clase es la encargada de indicarle a todos los objetos del juego que actuen en el momento correspondiente.Instance Variables:	x	<Number>	y	<Number>!!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:38'!agregarNuevosObjetos	"crea los nuevos objetos a agregar al escenario segun corresponda"	flotaEnemigos actualizar.	(flotaEnemigos tieneNaves) ifTrue: [		self agregarObjeto: (flotaEnemigos getNave).		] .	(flotaNeutrales tieneNaves ) ifTrue: [		self agregarObjeto: (flotaNeutrales getNave).		].	! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 22:43'!agregarObjeto: unObjeto	"agrega un objeto al escenario"	objetos add: unObjeto.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 09:55'!cambiarNivel 	"intenta cambiar el nivel y devuelve true o false segun 	si ha podido hacerlo o no"		(clasesDeNaves size > 1) ifTrue: [		clasesDeNaves removeFirst.		self reiniciar.		^true.		] .	^false.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 23:35'!cantObjetos	^objetos size.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 04:24'!chequearColisiones	"chequea las colisiones entre todos sus objetos"			|nuevosObjetos unObjeto otroObjeto indice|		"si hay menos de dos objetos no hay nada que chequear"	(self cantObjetos < 2 )ifTrue: [^nil].	"sino debo chequear todas las combinaciones posibles	para ello quito el primer objeto de la lista 'objetos' y chequeo 	si choca o no con los siguientes, asi hasta que solo quede un objeto"	nuevosObjetos := LinkedList new.	 [self cantObjetos > 0]whileTrue:[		"quito el primero de la lista objetos"		unObjeto := objetos removeFirst.		indice := 1.		"chequeo si choca con los restantes, hasta que choque con alguno o 		ya no haya con quien chequear"		[(unObjeto seguirActuando) & (indice <= (objetos size))]whileTrue:[ 			otroObjeto := objetos at: indice.			"si otro objeto no puede actuar no tiene sentido que se choquen"			(otroObjeto seguirActuando ) ifTrue: [				unObjeto chocarCon: otroObjeto.				].			indice := indice +1.			].		"chequeo si un objeto debe seguir actuando"		(unObjeto seguirActuando ) ifTrue: [			nuevosObjetos add: unObjeto ]		ifFalse: [ 			jugador sumarPuntos: (unObjeto getPuntos).			(unObjeto dejaNuevoObjetoAlMorir) ifTrue: [				nuevosObjetos add: unObjeto dejarNuevoObjetoAlMorir.				]						]		].	objetos := nuevosObjetos.	"verifico si la nave del algo 42 ha muerto"	self chequearNaveAlgo42.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:38'!chequearNaveAlgo42 	"chequea si la nave del algo 42 ha muerto, en tal caso 	debe indicarle a jugador que descuente una vida y reiniciar la nave	del algo42 "	|algo42|		algo42 := jugador getAlgo42.	(algo42 seguirActuando ) ifFalse: [		algo42 := NaveAlgo42 new.		jugador setAlgo42: algo42.		jugador descontarVida.		self reiniciar.		self agregarObjeto: algo42.		].! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 22:59'!contiene: unObjeto	^(objetos includes: unObjeto).! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:42'!getClaseNave 	( (clasesDeNaves size) > 0 ) ifTrue: [		^clasesDeNaves first]	ifFalse: [ 		ClasesDeNavesAgotadaError new signal]! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:45'!initialize 		self setTamanioX: 30 Y:30.	self setObjetos.	self setClasesDeNaves.	self setFlotaEnemigos.	self setFlotaNeutrales.	! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 15:08'!objetosActuar	"indica a cada uno de sus objetos que actue segun corresponda"		|nuevosObjetos nuevoObjeto|		nuevosObjetos := LinkedList new.	objetos do: [:objeto|		(objeto seguirActuando ) ifTrue: [			nuevoObjeto := (objeto actuar).			(nuevoObjeto = nil) ifFalse: [				nuevosObjetos add: nuevoObjeto.				].			nuevosObjetos add: objeto.			]		].	objetos := nuevosObjetos.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 09:56'!puedeCambiarNivel	^((clasesDeNaves size )> 1).! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 15:00'!reiniciar 	"este metodo limpia el escenario"	self setObjetos.	self setFlotaEnemigos.			! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:24'!setClasesDeNaves	clasesDeNaves := LinkedList new.	clasesDeNaves add: Avioneta.	clasesDeNaves add: Bombardero.	clasesDeNaves add: Explorador.	clasesDeNaves add: Cazas.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:28'!setFlotaEnemigos	flotaEnemigos := FlotaEnemiga crearConClase: (self getClaseNave).! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:27'!setFlotaNeutrales	flotaNeutrales := FlotaNavesNeutrales new.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 19:59'!setJugador: unJugador	"inicializa jugador y crea la nave del algo42 "	|algo42|	jugador := unJugador .	algo42 := NaveAlgo42 new.	jugador setAlgo42: algo42.	self agregarObjeto: algo42.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:25'!setObjetos	objetos := LinkedList new.! !!EscenarioDeJuego methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 19:35'!setTamanioX: x Y: y	Posicion setX: x.	Posicion setY: y.! !Error subclass: #FaltaDeCargaError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Object subclass: #FlotaNaves	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!FlotaNaves commentStamp: '<historical>' prior: 0!esta clase es la encargada de crear las naves en la posicion que corrresponda.!]style[(78)f1!!FlotaNaves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:47'!getNave 	"debe devolver una nueva nave segun corresponda"	self subclassResponsibility.! !!FlotaNaves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 13:44'!tieneNaves	"devuelve true o false segun si la flota puede devolver	una nueva nave o no"		self subclassResponsibility.! !FlotaNaves subclass: #FlotaEnemiga	instanceVariableNames: 'claseNave guia naves retardoCreacion llamadasTieneNaves'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!FlotaEnemiga commentStamp: '<historical>' prior: 0!esta clase se encarga de crear las nuevas naves segun corresponda y asignarles un guia.!]style[(87)f1!!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 13:47'!actualizar	"verifica si el guia puede seguir actuando, de no ser asi	debe crear nuevas naves con un nuevo guia"	(guia seguirActuando ) ifFalse: [		self crearNaves.]! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:33'!crearNaves 	"crea todas las naves de la flota"	|unaPosicion  unaNave  unGuia cantNaves|		naves := LinkedList new.	cantNaves := (4 atRandom) + 15. "la cantidad de naves es aleatoria con un minimo de 15 naves"	unGuia := claseNave crear.	unGuia setGuia: unGuia.	guia := unGuia.	"creo todas las naves con el guia correspondiente"	cantNaves timesRepeat: [ 		unaNave := claseNave crear.		unaNave setGuia: unGuia.		naves add: unaNave.		].	"agrego el guia a lo ultimo y lo cambio a cualquier posicion"	naves add: guia.	naves swap:  ((cantNaves+1) atRandom ) with: (cantNaves +1) .! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:10'!getGuia	^guia.! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:12'!getNave		"devuelve una nave de la flota"		"si no hay naves no debe devolver mas naves"	( naves size > 0 ) ifFalse: [ NoHayNavesError new signal].	^(naves removeFirst). ! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:28'!getNaveSinChequeo	"devuelve una nave siempre, sin chequear si hay o no naves"		^naves removeFirst.! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:21'!initialize	retardoCreacion := 3.	llamadasTieneNaves := ContadorSimple crear: retardoCreacion.	! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:24'!reiniciarLlamadasTieneNaves 	llamadasTieneNaves := ContadorSimple crear: retardoCreacion.! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 14:48'!setClaseNave: unaClaseNave	claseNave := unaClaseNave .! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 14:43'!setGuia: unaNave	guia := unaNave.! !!FlotaEnemiga methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 20:25'!tieneNaves	"el chequeo de llamadaTiene naves es para evitar que las naves se superpongan"	(llamadasTieneNaves agotado ) ifTrue: [ 		self reiniciarLlamadasTieneNaves.		^((naves isEmpty not) & (guia seguirActuando))].	llamadasTieneNaves descontar.	^false.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!FlotaEnemiga class	instanceVariableNames: ''!!FlotaEnemiga class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:58'!crearConClase: unaClaseNave	|unaFlota|		unaFlota := FlotaEnemiga new.	unaFlota setClaseNave: unaClaseNave.	unaFlota crearNaves.	^unaFlota.! !FlotaNaves subclass: #FlotaNavesNeutrales	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!FlotaNavesNeutrales commentStamp: '<historical>' prior: 0!esta clase es la encargada de crear las naves civiles y policias.!]style[(65)f1!!FlotaNavesNeutrales methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:34'!crearNaveCivil 	"los civiles siempre se mueven de izquierda a derecha"	^Civiles crear.! !!FlotaNavesNeutrales methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:34'!crearNavePolicia		"crea una instancia de la clase policia en la posicion correspondiente"	^Policias crear.	! !!FlotaNavesNeutrales methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:47'!getNave  	"crear nave debe devolver una instancia de policia o de civil aleatoriamente"		((2 atRandom) = 2) ifTrue: [^self crearNavePolicia ].	^self crearNaveCivil. ! !!FlotaNavesNeutrales methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:16'!tieneNaves 		"las naves neutrales se crean aleatoriamente " 	^((5 atRandom) = 5).   ! !Object subclass: #Juego1942	instanceVariableNames: 'jugador escenario'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:33'!chequearCambioDeNivel	((jugador getPuntos)>= 1000) ifTrue: [		(escenario cambiarNivel) ifFalse: [^nil]. "si no pudo cambiar de nivel sale"			jugador reiniciarPuntos.		]	! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 15:07'!ganado	"devuelve true o false segun si se ha ganado el juego o no"	"el juego se ha ganado si: el jugador llego a 1000 puntos, se encuentra en 	el ultimo nivel y aun pude seguir jugando"	(escenario puedeCambiarNivel ) ifFalse: [		(jugador getPuntos >= 1000 ) ifTrue: [			(jugador seguirJugando ) ifTrue: [				^true.				] 			]		].	^false.	! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:05'!getEscenario	^escenario.! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:04'!getJugador	^jugador.! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:22'!initialize	jugador := Jugador new.	escenario := EscenarioDeJuego new.	escenario setJugador: jugador.! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 15:03'!jugar 	"indica a escenario que lleve a cabo todas las acciones para actulizar los 	objetos de juego"	escenario objetosActuar.	escenario chequearColisiones.	escenario agregarNuevosObjetos.	self chequearCambioDeNivel.! !!Juego1942 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:31'!perdido	^jugador seguirJugando not.! !Object subclass: #Jugador	instanceVariableNames: 'puntos vidas nave'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:08'!descontarVida	[vidas descontar] on: ContadorStopError do: [VidasAgotadasError new signal].	! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 15:14'!getAlgo42 	^nave.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 20:24'!getPuntos	^puntos.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 20:30'!getVidas	^vidas getValor.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:26'!initialize	vidas:= ContadorSimple crear: 3.	puntos := 0.	nave := nil.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 23:39'!reiniciarPuntos	puntos:= 0.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 15:03'!seguirJugando	(self vidasAgotadas) ifTrue: [ "si no tiene mas vidas depende de si 		la nave aun tiene energia"		^ (nave seguirActuando ) 		].	"si aun tiene vidas puede seguir jugando"	^true.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 15:04'!setAlgo42: algo42	nave := algo42.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 13:59'!sumarPuntos: unValor	puntos := unValor + puntos.! !!Jugador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 14:10'!vidasAgotadas	^(vidas agotado)."vidas es un contador"! !Armas subclass: #Laser	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Laser methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 14:03'!initialize 	"inicializa laser, la carga del laser no se acaba."	carga := CargaNoAgotable new.	balas:= LuzLaser	! !Armas subclass: #LaserAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!LaserAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:56'!initialize 	"inicializa laser, la carga del laser no se acaba."	carga := CargaNoAgotable new.	balas:= LuzLaserAlgo42.! !Error subclass: #NoHayNavesError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Object subclass: #ObjetoDelEscenario	instanceVariableNames: 'r'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ObjetoDelEscenario methodsFor: 'choque' stamp: 'CelesteCingolani 5/5/2011 22:52'!chocaCon: otroObjeto		^(self getForma) intersecta: (otroObjeto getForma ).! !!ObjetoDelEscenario methodsFor: 'choque' stamp: 'CelesteCingolani 5/5/2011 22:53'!chocarCon: otroObjeto	self subclassResponsibility.! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 22:55'!actuar 	self subclassResponsibility.! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 23:01'!dejaNuevoObjetoAlMorir	"indica si al morir la nave deja algun objeto, por defecto no dejaran nada"	^false	"en caso de redefinir este metodo se debera definir el metodo dejarNuevoObjetoAlMorir" ! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 22:53'!getForma	^Circulo crearConCentro: (self getPosicion) conR: (r). ! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 22:54'!getPosicion	self subclassResponsibility.! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 23:04'!getPuntos	"devuelve la cantidad de puntos que otorga un objeto al ser destruido"	self subclassResponsibility.! !!ObjetoDelEscenario methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 23:02'!seguirActuando	"indica si el objeto puede seguir actuando o no"		self subclassResponsibility.! !ObjetoDelEscenario subclass: #Balas	instanceVariableNames: 'desplazador danio alcance estado'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Balas commentStamp: '<historical>' prior: 0!Balas son aquellos objetos que puden impactar contra las naves produciéndole algún daño.Instance Variables:	danio	<ProtoObject | PseudoContext>!!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:23'!chocarConObjetoEspecial: unObjeto	"las balas no se chocan con los objetos especiales"! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:17'!dispararA: unaNave	"dispara a una nave indicandole el danio que le produce"	unaNave recibirDisparo: self getDanio.	self desactivar."esto permite indicar que la bala ya ha actuado y no debe daniar 	a otras naves".! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 16:50'!getAlcance	^alcance getValor.! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 19:06'!getDanio 	^danio getValor.! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 10:50'!getPosicion 	^desplazador getPosicion.! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 15:01'!getPuntos	"devuelve la cantidad de puntos que se obtiene al destruirla	las balas no otorgan puntos"	^0.	! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 00:20'!initialize 	self activar.	r := 0.5.! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:50'!mover 	"avanza una posicion y devuelve el valor de la nueva posicion"		[alcance descontar] on: ContadorStopError do: [ AlcanceAgotadoError new signal].	^desplazador mover.	! !!Balas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 13:43'!setDesplazador: claseDesplazador desde: unaPosicion hacia: otraPosicion	desplazador := claseDesplazador crearDesde: unaPosicion hacia: otraPosicion.! !!Balas methodsFor: 'choque' stamp: 'CelesteCingolani 5/5/2011 16:20'!chocarConNave: unaNave	self dispararA: unaNave.! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 4/30/2011 16:40'!activa 	"devuelve true o false segun si la nave esta activa o no"		^estado.! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 4/30/2011 16:52'!activar	estado := true. "estado activo"! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 5/3/2011 15:06'!actuar 	self mover.	^nil.! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 4/30/2011 16:52'!desactivar	estado := false.! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 4/30/2011 16:41'!seguirActuando 	^((self activa) & (self seguirAvanzando)).! !!Balas methodsFor: 'acciones' stamp: 'CelesteCingolani 4/21/2011 01:45'!seguirAvanzando	^(alcance agotado) not.! !Balas subclass: #BalasAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalasAlgo42 commentStamp: '<historical>' prior: 0!esta es una clase abstracta cuyas instancias seran las balas del algo42.!]style[(72)f1!!BalasAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:17'!chocarCon: otroObjeto	(self chocaCon: otroObjeto) ifTrue: [		otroObjeto chocarConBalaAlgo42: self]! !!BalasAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:29'!chocarConAlgo42: algo42	"no debe hacerle nada"! !!BalasAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:29'!chocarConBalaAlgo42: unaBala 		"las balas no se chocan entre si"	! !!BalasAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:29'!chocarConBalaEnemigos: unaBala	"las balas no se chocan entre si"! !!BalasAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:29'!chocarConNaveAutonoma: unaNave	"debe atacar a la nave enemiga"	super chocarConNave: unaNave.! !BalasAlgo42 subclass: #BalaCoheteAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalaCoheteAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:52'!initialize 	super initialize.	danio := DanioLineal crear: 10.	alcance := ContadorSimple crear: 10.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BalaCoheteAlgo42 class	instanceVariableNames: ''!!BalaCoheteAlgo42 class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:52'!crearDesde: unaPosicion hacia: otraPosicion		|unCohete|		unCohete  :=  BalaCoheteAlgo42  new.	unCohete setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unCohete.! !BalasAlgo42 subclass: #BalaTorpedoRastreadorAlgo42	instanceVariableNames: 'rRastreo naveEncontrada naveAAtacar'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:19'!dispararA: unaNave	"dispara a una nave o la asigna como nave a seguir"	"si ya ha encontrado una nave debe dispararle, pues quiere decir que se han chocado"	(naveEncontrada) ifTrue: [		super dispararA: unaNave]	"si aun no ha encontrado ninguna nave debe asignarla cono nave a seguir, 	pues quiere decir que se ha chocado con su 'forma de rastreo', como esta 	forma es mas grande que el resto de las naves me aseguro de que la nave aun	no haya chocado con la forma comun de la bala."	ifFalse: [ 		naveEncontrada := true.		naveAAtacar := unaNave.		desplazador := DesplazadorBuscador crearDesde: (self getPosicion) hacia: (unaNave getPosicion)		]! !!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 00:23'!getForma 	"si ya ha encontrado la nave a seguir para chocar con ella toma la forma habitual"	(naveEncontrada ) ifTrue: [		^ super getForma.		].	"sino toma una forma mas grande para encontrar una nave"	^ (Circulo crearConCentro: (self getPosicion) conR: rRastreo )! !!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 00:52'!getNaveAAtacar	^naveAAtacar.! !!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 01:00'!initialize 	super initialize.	rRastreo := 5.	naveEncontrada := false.	danio := DanioLineal crear: 20.	alcance := ContadorSimple crear: 10.! !!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 03:30'!mover 	(naveEncontrada ) ifTrue: [ 		desplazador setPosicionAseguir: (naveAAtacar getPosicion )].	super mover.! !!BalaTorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 04:06'!naveEncontrada 	^naveEncontrada.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BalaTorpedoRastreadorAlgo42 class	instanceVariableNames: ''!!BalaTorpedoRastreadorAlgo42 class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 00:49'!crearDesde: unaPosicion hacia: otraPosicion		|unTorpedo|		unTorpedo  :=  BalaTorpedoRastreadorAlgo42 new.	unTorpedo setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unTorpedo.! !Balas subclass: #BalasEnemigas	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalasEnemigas methodsFor: 'choque' stamp: 'CelesteCingolani 5/3/2011 23:17'!chocarCon: otroObjeto	(self chocaCon: otroObjeto ) ifTrue: [		otroObjeto chocarConBalaEnemigos: self.		]! !!BalasEnemigas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 19:47'!chocarConAlgo42: algo42	"las balas enemigas deben atacar al algo42"	self chocarConNave: algo42.! !!BalasEnemigas methodsFor: 'choque' stamp: 'CelesteCingolani 5/3/2011 23:18'!chocarConBalaAlgo42: unaBala	"las balas no se afectan entre si"! !!BalasEnemigas methodsFor: 'choque' stamp: 'CelesteCingolani 5/3/2011 23:18'!chocarConBalaEnemigos: unaBala	"las balas no se afectan entre si"! !!BalasEnemigas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 00:16'!chocarConNaveAutonoma: unaNave	"las balas enemigas no afectan las naves autonomas"! !BalasEnemigas subclass: #BalaCohete	instanceVariableNames: 'naveAAtacar'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalaCohete methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 16:19'!initialize 	super initialize.	danio := DanioLineal crear: 10.	alcance := ContadorSimple crear: 10.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BalaCohete class	instanceVariableNames: ''!!BalaCohete class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 02:26'!crearDesde: unaPosicion hacia: otraPosicion		|unCohete|		unCohete  :=  BalaCohete  new.	unCohete setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unCohete.! !BalasEnemigas subclass: #BalaTorpedoRastreador	instanceVariableNames: 'naveAAtacar'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalaTorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 16:19'!initialize 	super initialize.	danio := DanioLineal crear: 20.	alcance := ContadorSimple crear: 10.! !!BalaTorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 10:16'!mover 	desplazador setPosicionAseguir: (naveAAtacar getPosicion ).	super mover.! !!BalaTorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 10:01'!setNaveAAtacar: unaNave	naveAAtacar := unaNave.	! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BalaTorpedoRastreador class	instanceVariableNames: ''!!BalaTorpedoRastreador class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 15:58'!crearDesde: unaPosicion hacia: otraPosicion		|unaBalaTorpedo|		unaBalaTorpedo  :=  BalaTorpedoRastreador new.	unaBalaTorpedo setDesplazador: DesplazadorBuscador desde: unaPosicion hacia: otraPosicion .	^unaBalaTorpedo.! !BalasEnemigas subclass: #BalaTorpedoSimple	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!BalaTorpedoSimple methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 17:10'!initialize 	super initialize.	danio := DanioLineal crear: 20.	alcance := ContadorSimple crear: 10.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BalaTorpedoSimple class	instanceVariableNames: ''!!BalaTorpedoSimple class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:14'!crearDesde: unaPosicion hacia: otraPosicion		|unTorpedoSimple|		unTorpedoSimple   :=  BalaTorpedoSimple new.	unTorpedoSimple  setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unTorpedoSimple .! !BalasEnemigas subclass: #LuzLaser	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!LuzLaser methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/30/2011 16:19'!initialize 	super initialize.	danio := DanioLineal crear: 5.	alcance := ContadorSimple crear: 5.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!LuzLaser class	instanceVariableNames: ''!!LuzLaser class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 23:59'!crearDesde: unaPosicion hacia: otraPosicion		|unaLuzLaser|		unaLuzLaser  :=  LuzLaser new.	unaLuzLaser setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unaLuzLaser.! !BalasAlgo42 subclass: #LuzLaserAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!LuzLaserAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:30'!initialize 	super initialize.	danio := DanioLineal crear: 5.	alcance := ContadorSimple crear: 5.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!LuzLaserAlgo42 class	instanceVariableNames: ''!!LuzLaserAlgo42 class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:40'!crearDesde: unaPosicion hacia: otraPosicion		|unaLuzLaser|		unaLuzLaser  :=  LuzLaserAlgo42 new.	unaLuzLaser setDesplazador: DesplazadorLineaRecta desde: unaPosicion hacia: otraPosicion .	^unaLuzLaser.! !ObjetoDelEscenario subclass: #Naves	instanceVariableNames: 'energia'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 11:25'!energiaAgotada	"devuelte true o false segun corresponda"		^ energia agotada.! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/17/2011 16:37'!getEnergia	^(energia getValor).! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:56'!initialize 	r:= 1.! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:40'!morir 	energia agotar.	! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 21:47'!recibirDisparo:  unValor	"recibe el disparo de una nave enemiga, debe reducir la energia segun el danio recibido"		energia recibirDanio: unValor.	! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:00'!seguirActuando	"devuelve true o false segun si debe seguir actuando o no"		^(energia agotada) not.	! !!Naves methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/21/2011 12:30'!setEnergia: unaEnergia		energia := unaEnergia.	! !!Naves methodsFor: 'choque' stamp: 'CelesteCingolani 5/5/2011 16:19'!chocarConBala: unaBala	unaBala dispararA: self.! !Naves subclass: #NaveAlgo42	instanceVariableNames: 'nave desplazador'	classVariableNames: 'algo42'	poolDictionaries: ''	category: 'TP1-1942'!!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 15:23'!actuar 	"por el momento no hace nada hay que cambiarlo en el futuro"	^nil.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:48'!disparar 	"dispara el arma correspondiente a la nave y devuelve una bala"		^nave disparar.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 20:18'!getPosicion		^ desplazador getPosicion.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 16:48'!getPuntos	"si pierde la nave se restan 100 puntos"	^-100.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:29'!initialize	super initialize.	nave := Avioneta new.	nave setBalas: LuzLaserAlgo42.	energia := EnergiaLineal crear: 100.	desplazador :=  DesplazadorAlgo42 new.	nave setDesplazador: desplazador.	algo42 := self.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:55'!moverAb	desplazador moverAb.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:56'!moverArr	desplazador moverArr.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:57'!moverDer	desplazador moverDer.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:57'!moverIzq	desplazador moverIzq.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:31'!puedeSeguirDisparando	(nave puedeSeguirDisparando ) ifFalse: [		self reiniciarArma.		].	^nave puedeSeguirDisparando.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:34'!reiniciarArma	nave setArma: (LaserAlgo42).! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:39'!tomarArmaBombardero	|unArmaCompuesta|		unArmaCompuesta := ArmaCompuesta new.	unArmaCompuesta addArma: CoheteAlgo42 new.	unArmaCompuesta addArma: TorpedoRastreadorAlgo42  new.	nave setArmaYaCreada: unArmaCompuesta.! !!NaveAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:50'!tomarEnergiaCaza 	"debe aumentar su energia tanto como contiene el tanque de energia de un caza"	energia := (energia) + (Cazas getEnergia ).! !!NaveAlgo42 methodsFor: 'choque' stamp: 'CelesteCingolani 5/2/2011 14:50'!chocarCon: otroObjeto	(self chocaCon: otroObjeto ) ifTrue:[  		otroObjeto chocarConAlgo42: self.		]! !!NaveAlgo42 methodsFor: 'choque' stamp: 'CelesteCingolani 5/1/2011 17:46'!chocarConBalaAlgo42: unaBala	"sus propias balas no lo afectan"! !!NaveAlgo42 methodsFor: 'choque' stamp: 'CelesteCingolani 5/1/2011 17:45'!chocarConBalaEnemigos: unaBala	self chocarConBala: unaBala.! !!NaveAlgo42 methodsFor: 'choque' stamp: 'CelesteCingolani 5/1/2011 20:34'!chocarConNaveAutonoma: unaNave	"al chocar con nave autonoma ambas naves deben	morir y el algo 42 suma los puntos que le deje la nave"		(self seguirActuando ) ifTrue: [		self morir.		unaNave chocarConAlgo42: self.		]	! !!NaveAlgo42 methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:55'!chocarConObjetoEspecial: unObjetoEspecial	unObjetoEspecial chocarConAlgo42: self.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!NaveAlgo42 class	instanceVariableNames: ''!!NaveAlgo42 class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:14'!getAlgo42	^algo42.! !Naves subclass: #NavesAutonomas	instanceVariableNames: 'desplazador velocidad'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!NavesAutonomas commentStamp: '<historical>' prior: 0!ElemMovil es una clase abstracta, cuyas clases derivadas deben tener un desplazador que les permita moverse en el escenario de juego.Instance Variables:	posicion	<ProtoObject | PseudoContext>	desplazador	<Object>!!NavesAutonomas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:54'!chocarConObjetoEspecial: unObjetoEspecial	"las naves autonomas no chocan con los objetos especiales"! !!NavesAutonomas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 11:12'!getPosicion	" solo el desplazador sabe la posicion en que se encuentra la nave"	^desplazador getPosicion.! !!NavesAutonomas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 23:00'!mover     "mueve el objeto segun corresponda, devuelve la nueva posicion del objeto"	"si la energia del objeto se ha agotado no debe permitir moverlo"	(self energiaAgotada) ifTrue: [EnergiaAgotadaError new signal].	^desplazador mover.	! !!NavesAutonomas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:08'!setDesplazador: unDesplazador	desplazador := unDesplazador.! !!NavesAutonomas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:54'!setDesplazador: claseDesplazador desde: unaPosicion hacia: otraPosicion	"precondiciones:		claseDesplazador debe ser una clase derivada		de la clase desplazadores" 	desplazador := claseDesplazador crearDesde: unaPosicion  hacia: otraPosicion.	desplazador setVelocidad: velocidad.! !!NavesAutonomas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:53'!chocarCon: otroObjeto	(self chocaCon: otroObjeto) ifTrue: [ 		otroObjeto chocarConNaveAutonoma: self.		]! !!NavesAutonomas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:53'!chocarConAlgo42: algo42	"si la "	(self seguirActuando ) ifTrue: [		self morir.		algo42 chocarConNaveAutonoma: self.		].		 ! !!NavesAutonomas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:53'!chocarConBalaAlgo42: unaBala		self chocarConBala: unaBala. ! !!NavesAutonomas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:53'!chocarConBalaEnemigos: unaBala	"las naves autonomas no se ven daniadas por las balas de los 	enemigos"! !!NavesAutonomas methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:53'!chocarConNaveAutonoma: unaNave	"las naves autonomas no se chocan entre si"! !NavesAutonomas subclass: #NavesArmadas	instanceVariableNames: 'arma guia avanzar'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:04'!actuar	"indica a la nave que actue segun corresponda"	"si esta en actitud de avanzar debe avanzar y disparar sino solo se 	debe mover."	self mover. 	(self avanzar) ifTrue: [ 		((3) atRandom = 1) ifTrue: [ ^self disparar]		]. 	^nil.! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:39'!avanzar	"indica si la nave debe avanzar o retroceder"		"si la nave esta en actitud de retroceder directamente se devuelve ese valor"	(avanzar) ifFalse: [^false].		"si tiene guia hay que ver si este no ha muerto"	(guia notNil) ifTrue: [		"si ha muerto las naves deben retroceder: "		(guia seguirActuando) ifFalse: [ 			avanzar := false.			desplazador retroceder.			]		].  	^avanzar.! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/20/2011 00:26'!disparar	"dispara el arma correspondiente a la nave y devuelve una bala"		"si la energia de la nave esta agotada no debe permitirle que siga actuando"	(self energiaAgotada ) ifTrue: [EnergiaAgotadaError new signal].	"si el arma esta agotada simplemente no hace nada, sino debe disparar"	(self puedeSeguirDisparando) ifTrue:	[ ^(arma  dispararDesde: self getPosicion hacia: (desplazador getSigPos))].! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 14:32'!getGuia	^guia.! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 19:25'!puedeSeguirDisparando	^arma puedeSeguirDisparando.! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/18/2011 21:38'!setArma: unaClaseArma	"inicializa arma como una instancia de la clase recibida por parametro"	arma := unaClaseArma new.! !!NavesArmadas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 14:49'!setGuia: unaNave	guia := unaNave.! !NavesArmadas subclass: #Avioneta	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Avioneta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:41'!getPuntos 		^20.		! !!Avioneta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:58'!initialize  	super initialize.	energia := EnergiaLineal crear: 20.	arma := Laser new.	avanzar := true.	velocidad := r * 3 / 4.! !!Avioneta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:33'!setArmaYaCreada: unArma	arma := unArma.! !!Avioneta methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 16:56'!setBalas: unaClaseBalas		arma setBalas: unaClaseBalas.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Avioneta class	instanceVariableNames: 'guia'!!Avioneta class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:29'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomX crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomX getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Avioneta class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 09:04'!crearDesde: unaPosicion hacia: otraPosicion	|unaAvioneta| 		unaAvioneta := Avioneta new.	unaAvioneta setDesplazador: DesplazadorLineaRecta desde: unaPosicion  hacia: otraPosicion.	^unaAvioneta .! !Avioneta subclass: #AvionetaDePrueba	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!AvionetaDePrueba commentStamp: '<historical>' prior: 0!avioneta de prueba permite hacer las prubas necesarias. redefine actuar para que dispare siempre.!]style[(97)f1!!AvionetaDePrueba methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 23:31'!actuar 	self mover.	^self disparar.! !!AvionetaDePrueba methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 11:43'!initialize 	super initialize.	retardoMovimiento := 0.	llamadosMover := 0.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!AvionetaDePrueba class	instanceVariableNames: ''!!AvionetaDePrueba class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:30'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomX crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomX getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!AvionetaDePrueba class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 23:30'!crearDesde: unaPosicion hacia: otraPosicion	|unaAvioneta| 		unaAvioneta := AvionetaDePrueba  new.	unaAvioneta setDesplazador: DesplazadorLineaRecta desde: unaPosicion  hacia: otraPosicion.	^unaAvioneta .! !NavesArmadas subclass: #Bombardero	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:38'!dejaNuevoObjetoAlMorir 	"el bombardero deja su arma para que sea tomada por el algo42"	^true.! !!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:24'!dejarNuevoObjetoAlMorir 	^(ArmaBombardero crearEn: (self getPosicion )).! !!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:44'!getPuntos	^30.! !!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 22:59'!initialize 	super initialize.	energia:= (EnergiaLineal crear: 30).	avanzar := true.	velocidad := r / 3 .! !!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:26'!morir 	super morir.	"si es el guia debe borrar la referencia de la clase"	(self = (Bombardero getGuia) ) ifTrue: [		Bombardero anularGuia.		].	"le debe indicar al algo 42 que tome su arma"	! !!Bombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:25'!setNaveAAtacar: unaNave	arma:= ArmaCompuesta new.	arma addArma: (Laser new).	arma addArma: (Cohete new).	arma addArma: (TorpedoRastreador new setNaveAAtacar: unaNave).	! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Bombardero class	instanceVariableNames: 'guia'!!Bombardero class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:30'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomX crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomX getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Bombardero class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/1/2011 17:13'!crearDesde: unaPosicion hacia: otraPosicion	"devuelve una instancia de self con sus valores inicializados, una nave	sera la nave rastreada por dicha instancia."		|unBombardero| 		unBombardero := Bombardero new.	unBombardero setDesplazador: DesplazadorZigZag desde: unaPosicion  hacia: otraPosicion.	unBombardero setNaveAAtacar: (NaveAlgo42 getAlgo42 ).	^unBombardero.! !!Bombardero class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 11:28'!crearDesde: unaPosicion hacia: otraPosicion atacarA: unaNave	"devuelve una instancia de self con sus valores inicializados, una nave	sera la nave rastreada por dicha instancia."		|unBombardero| 		unBombardero := Bombardero crearDesde: unaPosicion  hacia:  otraPosicion.	unBombardero setNaveAAtacar: unaNave.	^unBombardero.! !NavesArmadas subclass: #Cazas	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Cazas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:45'!getPuntos 	^30.! !!Cazas methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 09:51'!initialize 	super initialize.	energia := Cazas getEnergia.	avanzar := true.	velocidad := r /2. 	arma := TorpedoSimple new.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Cazas class	instanceVariableNames: 'guia'!!Cazas class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:30'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionV crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionV getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Cazas class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:18'!crearDesde: unaPosicion hacia: otraPosicion	"devuelve una instancia de self con sus valores inicializados" 		|unCaza| 		unCaza  := Cazas new.	unCaza  setDesplazador: DesplazadorLineaRecta  desde: unaPosicion  hacia: otraPosicion.	^unCaza .! !!Cazas class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:42'!getEnergia	^(EnergiaLineal crear: 30).! !NavesArmadas subclass: #Explorador	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Explorador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 10:00'!disparar 	^nil.! !!Explorador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:46'!getPuntos 	^50.! !!Explorador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 09:58'!initialize 	super initialize.	energia := (EnergiaLineal crear: 50).	velocidad := r/2.! !!Explorador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 09:59'!puedeSeguirDisparando 	"los exploradores no  tienen arma"	^false.	! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Explorador class	instanceVariableNames: ''!!Explorador class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:33'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomX crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomX getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Explorador class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:11'!crearDesde: unaPosicion hacia: otraPosicion	|unExplorador| 		unExplorador := Explorador new.	unExplorador setDesplazador: (DesplazadorCircularAvanzandoY crearDesde: unaPosicion hacia: otraPosicion r: 3).	^unExplorador.! !NavesAutonomas subclass: #NavesSinArma	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!NavesSinArma methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 15:05'!actuar 	self mover. 	^nil.! !!NavesSinArma methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 23:02'!initialize 			super initialize.	velocidad := r/2.! !NavesSinArma subclass: #Civiles	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Civiles methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 13:45'!getPuntos 	^-300.! !!Civiles methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 01:59'!initialize 	super initialize.	energia := (EnergiaLineal crear: 70).! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Civiles class	instanceVariableNames: ''!!Civiles class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:31'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomY crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomY getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Civiles class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 01:58'!crearDesde: unaPosicion hacia: otraPosicion	|unCivil| 		unCivil := Civiles new.	unCivil setDesplazador: DesplazadorLineaRecta desde: unaPosicion  hacia: otraPosicion.	^unCivil.! !ObjetoDelEscenario subclass: #ObjetoEspecial	instanceVariableNames: 'posicion seguirActuando'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 11:18'!actuar 	"los objetos especiales solo se quedan en su lugar"	^nil.! !!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 22:56'!getPosicion	^posicion.! !!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 23:04'!getPuntos	"los objetos especiales no otorgan puntos"	^0.! !!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:01'!initialize 		seguirActuando := true.	r := 1.! !!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:44'!seguirActuando 	^seguirActuando ! !!ObjetoEspecial methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:48'!setPosicion: unaPosicion	posicion := unaPosicion.! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 10:18'!chocarCon: otroObjeto	(self chocaCon: otroObjeto ) ifTrue: [		otroObjeto chocarConObjetoEspecial: self].	! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:43'!chocarConAlgo42: algo42	"dependiendo de que clase de objeto especial se trate debe actuar de forma distinta"		self subclassResponsibility.! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:42'!chocarConBalaAlgo42: unaBala	"si choca con una bala no hace nada"! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:40'!chocarConBalaEnemigos: unaBala	"no debe hacer nada al chocar con una bala"		! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:41'!chocarConNaveAutonoma: unaNave	"si choca con otra nave que no sea el algo42 desparece"	seguirActuando := false.! !!ObjetoEspecial methodsFor: 'choque' stamp: 'CelesteCingolani 5/4/2011 09:44'!chocarConObjetoEspecial: unObjetoEspecial	"si se chocan dos objetos especiales no hacen nada"! !ObjetoEspecial subclass: #ArmaBombardero	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!ArmaBombardero methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:21'!chocarConAlgo42: algo42	"al chocar con el algo42 este debe tomar el arma del bombardero"	algo42 tomarArmaBombardero.	seguirActuando := false.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!ArmaBombardero class	instanceVariableNames: ''!!ArmaBombardero class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:49'!crearEn: unaPosicion	"crea una instancia de ArmaBombardero en la posicion indicada"		|unArmaBombardero|		unArmaBombardero := ArmaBombardero new.	unArmaBombardero setPosicion: unaPosicion.	^unArmaBombardero.! !ObjetoEspecial subclass: #EnergiaCaza	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!EnergiaCaza methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:20'!chocarConAlgo42: algo42	"al chocar con el algo42 este debe tomar la energia"	algo42 tomarEnergiaCaza.	seguirActuando := false.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!EnergiaCaza class	instanceVariableNames: ''!!EnergiaCaza class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 09:58'!crearEn: unaPosicion	"crea una instancia de EnergiaCaza  en la posicion indicada"		|unaEnergiaCaza|		unaEnergiaCaza  := EnergiaCaza  new.	unaEnergiaCaza  setPosicion: unaPosicion.	^unaEnergiaCaza .! !NavesSinArma subclass: #Policias	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!Policias methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:05'!getPuntos 	^-200.! !!Policias methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:12'!initialize 	super initialize.	energia := (EnergiaLineal crear: 50).! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Policias class	instanceVariableNames: ''!!Policias class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:33'!crear 	|unaPosicion otraPosicion |	unaPosicion := CreadorPosicionAtRandomX crearPosicion.	otraPosicion := unaPosicion + (CreadorPosicionAtRandomX getDireccion).	^(self crearDesde: unaPosicion  hacia: otraPosicion  ).! !!Policias class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 02:10'!crearDesde: unaPosicion hacia: otraPosicion	|unPolicia| 		unPolicia := Policias new.	unPolicia setDesplazador: (DesplazadorCircularAvanzandoY crearDesde: unaPosicion hacia: otraPosicion r: 3).	^unPolicia.! !Point subclass: #Posicion	instanceVariableNames: ''	classVariableNames: 'X Y'	poolDictionaries: ''	category: 'TP1-1942'!!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/14/2011 16:30'!+ arg	^ Posicion X: (x + arg x) Y: (y + arg y).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/14/2011 16:34'!- arg	^ Posicion X:(x - arg x) Y: (y - arg y).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 01:18'!= otraPosicion	"este metodo anteriormente utilizaba el metodo 'closeTo', pero esto aun traia algunos 	problemas y como no se necesita tanta precision utilice mi propio metodo"	|errorPermitido|	errorPermitido := 0.01.	^(       ((self x - (otraPosicion x))  abs  < errorPermitido) 		& ((self y - (otraPosicion y))  abs   < errorPermitido)    )! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:18'!esValida 		^(( ( x >= 0 )&(x <=X))&((y >=0)&(y<=Y))).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/2/2011 18:49'!multiplicarPorEscalar: unNumero	^(Posicion X:((self x)*unNumero ) Y: ((self y) * unNumero ) )! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/23/2011 17:09'!multiploDeNorma: unFloat	|nuevaPosicion|		nuevaPosicion := self normalized.	^(Posicion X: (nuevaPosicion x * unFloat) Y: (nuevaPosicion y * unFloat)).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/23/2011 17:15'!normalized 	^(Posicion fromPoint: (super normalized )).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/14/2011 15:43'!obtenerDireccionHacia: otraPosicion	^(otraPosicion  - self).! !!Posicion methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/23/2011 17:29'!obtenerMinimoVecinoHacia: unaPosicion	"devuelve el punto vecino mas próximo a una posicion"		|dir|		(self = unaPosicion ) ifTrue: [^self].	dir := self obtenerDireccionHacia: unaPosicion.	dir := dir multiploDeNorma: (2 sqrt).	^(self + (Posicion X:((dir x) rounded) Y: ((dir y) rounded))).		! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Posicion class	instanceVariableNames: ''!!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/14/2011 16:02'!X: x Y: y	"devuelve una instancia de self "	|unaPosicion|		unaPosicion := Posicion new.	unaPosicion setX: x setY: y.	^unaPosicion.! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:27'!atRandomX	^Posicion X: (((X +1)atRandom)-1) Y: Y.! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:26'!atRandomY	^Posicion X: 0  Y: (((Y+1)atRandom )-1).! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:49'!centradaX	^Posicion X: (X/2) asInteger Y: 0.! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/22/2011 01:25'!fromPoint: aPoint		^(Posicion X: (aPoint x)Y: (aPoint y)).! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:19'!getX	^Y.! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:19'!getY	^Y.! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:19'!setX: unValor	X := unValor. ! !!Posicion class methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/27/2011 08:19'!setY:  unValor	Y := unValor .! !Armas subclass: #TorpedoRastreador	instanceVariableNames: 'nave'	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!TorpedoRastreador commentStamp: '<historical>' prior: 0!esta clase de arma dispara balas que pueden seguir a su enemigoInstance Variables:	nave	<ProtoObject | PseudoContext>!!TorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/3/2011 23:54'!dispararDesde: unaPosicion hacia: otraPosicion	|unaBala| 		unaBala := super dispararDesde: unaPosicion  hacia: otraPosicion.	unaBala setNaveAAtacar: nave. 	^unaBala. ! !!TorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 15:58'!initialize			" la carga del torpedo rastreador es 5 "	carga := CargaAgotable crear: 5.	balas:= BalaTorpedoRastreador.! !!TorpedoRastreador methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 4/19/2011 16:17'!setNaveAAtacar: unaNave	nave := unaNave.! !Armas subclass: #TorpedoRastreadorAlgo42	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!TorpedoRastreadorAlgo42 commentStamp: '<historical>' prior: 0!esta clase de arma dispara balas que pueden seguir a su enemigo.!]style[(64)f1!!TorpedoRastreadorAlgo42 methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/4/2011 10:29'!initialize			" la carga del torpedo rastreador es 5 "	carga := CargaAgotable crear: 5.	balas:= BalaTorpedoRastreadorAlgo42.! !Armas subclass: #TorpedoSimple	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!!TorpedoSimple methodsFor: 'as yet unclassified' stamp: 'CelesteCingolani 5/5/2011 16:14'!initialize 	"inicializa laser, la carga del laser no se acaba."	carga := CargaAgotable crear: 5.	balas:= BalaTorpedoSimple.! !Error subclass: #ValorInvalidoError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!Error subclass: #VidasAgotadasError	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP1-1942'!